package com.jdk8.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * java8   并行 串行 处理-->parallel
 * @author jyh
 *
 */
public class Java8_Stream_Parallel {
	
	/**
	 * 1:输入数据的大小会影响并行化处理，当只有足够大、每个数据处理管道花费的时间足够多时，并行化才有意义
	 * 2:一般都是基于集合进行并行化
	 * 3:处理基本类型比处理装箱类型要快
	 * 4:只有在多核的机器上使用才有意义，并且是运行时能够使用的多少核
	 * 5:原先处理耗时较长，使用并行化才有意义
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		/**
		//串行
		Long st1 = new  Date().getTime();
		Arrays.asList(
				1, 2, 3, 4, 5, 6, 7, 9, 8, 0, 1
				).stream()
		        .collect(Collectors.groupingBy(x -> x % 10))
		        .forEach((x, y) -> System.out.println(x + ":" + y));
		Long en1 = new  Date().getTime();
		System.out.println("=====>串行时长:"+(en1-st1)+"");
		System.out.println("----------------------------------------分割线--------------------------------------------------------------------");
		//并行
		Long st = new  Date().getTime();
		Arrays.asList(
				1, 2, 3, 4, 5, 6, 7, 9, 8, 0, 1
				).stream()
		       .parallel() .collect(Collectors.groupingBy(x -> x % 10))
		        .forEach((x, y) -> System.out.println(x + ":" + y));
		Long en = new  Date().getTime();
		System.out.println("=====>并行时长"+(en-st)+"");
		
		**/
		
		
		
		//串行排序
		List<String> list = new ArrayList<String>();
		for(int i=0;i<1000000;i++){
		double d = Math.random()*1000;
		list.add(d+"");
		}
		long start = System.nanoTime();//获取系统开始排序的时间点
		int count= (int) ((Stream) list.stream().sequential()).sorted().count();
		System.out.println("count:"+count);
		long end = System.nanoTime();//获取系统结束排序的时间点
		long ms = TimeUnit.NANOSECONDS.toMillis(end-start);//得到串行排序所用的时间
		System.out.println(ms+"ms");
		
	 
//		//并行排序
		List<String> list2 = new ArrayList<String>();
		for(int i=0;i<1000000;i++){
		double d = Math.random()*1000;
		list2.add(d+"");
		}
		long start2 = System.nanoTime();//获取系统开始排序的时间点
		int count2 = (int)((Stream) list2.stream().parallel()).sorted().count();
		System.out.println("count2:"+count2);
		long end2 = System.nanoTime();//获取系统结束排序的时间点
		long ms2 = TimeUnit.NANOSECONDS.toMillis(end2-start2);//得到并行排序所用的时间
		System.out.println(ms2+"ms");
		
		
		
	
	}

	

	

}
